Содержание

Тернарные выражения, проверки на пустоту

Вы могли заметить, что мы все больше и больше стараемся сократить наш код – делим код на универсальные блоки, используем классы, в каких-то моментах убираем фигурные скобки из условий и циклов. Сегодня мы научимся делать быстрые проверки на пустоту и сокращать простые одностроные if/else, реализуя их не на 8 строк, а на одну

Начнем с простых проверок на пустоту.


Продолжения действия только если слева не null

Что, если у нашей переменной нет никакого первоначального значения? Что, если она ничему не равна? Например, у меня есть вот такие две простые переменные

Две переменные типа данных int и string

Мы понимаем, что внутри них нет значений, однако коду это тоже нужно как-то обозначить. Для этого, в программировании есть значение по умолчанию – пустота, null. Для всех типов данных (КРОМЕ ЧИСЛОВЫХ), если внутри нее нет значения, у нее будет значение null. Подробнее об этом можете посмотреть в статье про переменные

В случае числовых типов данных, значение по умолчанию – 0. С помощью отладки я посмотрю, что находится внутри моих переменных, и увижу пустое значение

Значения внутри переменных

Кроме того, что после равно может ничего не быть, бывают случаи, когда код нам возвращает пустоту. Например, методы или Linq запросы могут возвращать null. Например, в этом Linq запросе код не нашел элемент, который равен «Нулевой», и вернул значение по умолчанию – null

FirstOrDefault вернул null

Или вот, я создала метод, который будет возвращать текст или null. Если условие не подходит, мы возвращаем null. Я вызвала метод, txt у меня равен «не текст», а значит условие неверно и в переменной будет Null

string ReturnTextOrNull(string txt) {     if (txt == "текст")         return txt;     else         return null; } string notFound = ReturnTextOrNull("не текст");

Метод вернул null

ВАЖНО – если у меня переменная null, тогда я не могу делать с ней никакие операции

Например, я захотела вызвать метод ToString() к этой переменной, но она была null. Тогда, код покажет мне ошибку

Ничего нельзя сделать если переменная null

Значит, мне нужно реализовать проверку на то, не null ли моя переменная. Я могу сделать это с помощью if (notFound != null), однако тогда нужно писать достаточно много текста. Вместо этого, я могу просто написать вопросительный знак после кусочка кода, который может мне потенциально вернуть null

string notFound = ReturnTextOrNull("не текст")?.ToString();

Вопросительный знак - тернарное выражение

Тогда, если значение и правда было null, код просто не пойдет дальше. Метод ToString не выполнится, а значит и ошибки не будет.

string notFound = ReturnTextOrNull("не текст")?.ToString(); Console.WriteLine(notFound);

Код выполнился с тернарником без ошибок

Но что, если в случае null, я хочу присвоить своей переменной какое-то значение по умолчанию?


Проверка на пустоту

Для присвоения значения в случае null я могу прописать следующий if

string notFound = ReturnTextOrNull("не текст"); if (notFound == null)     notFound = "По умолчанию";

Однако, это опять же долго. Опять же, я могу выполнить это условие в одну строчку – мне нужно поставить два равно после кода, который может потенциально вернуть null, а после них написать значение, которое я хочу, чтобы присвоилось. Тогда, если значение было равно пустоте, тогда у меня присвоится значение правее ??. Если значение было не равно пустоте, тогда присвоится значение левее ??

string notFound = ReturnTextOrNull("не текст") ?? "По умолчанию"; Console.WriteLine(notFound);

?? взял значение по умолчанию ?? взял обычное значение

Уже понятно, что вещь это удобная, так как она сокращает наш код. У нас может возникнуть вопрос, а если мы простой однострочный if записали в одну строку, можем ли мы так сделать и для других if?


Сокращение if

Мы можем сократить запись для конструкции if/else, даже тех, которые к null никак не относятся. Такие выражения называются тернарными

Например, у меня есть такое условие

string notFound = ReturnTextOrNull("текст"); if (notFound == "текст")     notFound = "Метод вернул текст"; else     notFound = "Метод вернул пустоту"; Console. WriteLine(notFound);

Его я могу представить следующим образом

string notFound = ReturnTextOrNull("текст") == "текст" ? "Метод вернул текст" : "Метод вернул пустоту"; Console.WriteLine(notFound);

Кратко - любой if, который существует чисто для того, чтобы присвоить в переменную разные значения, и не делает больше ничего, можно превратить в тернарное выражение

У тернарников следующая структура построения:

?? взял обычное значение
  • Условий может быть несколько, перечисленные через логические операторы И (&&) или ИЛИ (||)
  • Выражений должно быть обязательно 2 – для true или false
  • Тернарники можно применять только для присваивания какого-то значения

Итог

  • Хочу сделать так, чтобы код не шел дальше, если он встретил null - ставлю ? после null-значения
  • Хочу внести значение по умолчанию, если вдруг переменная была равна Null - ставлю ?? и после него значение по умолчанию
  • Если я хочу сократить условие, внутри каждого действия которого есть присваивание значения в переменную - строю if через ? :